#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "1.h"

static int cmp_int(const void *data1, const void *data2);
static int cmp_char(const void *data1, const void *data2);
static int cmp_string(const void *data1, const void *data2);
static void show_int(const void *data);
static void show_string(const void *data);
static void show_char(const void *data);

int main(int argc, char **argv)
{
	int a[] = {3,2,1,6,7,9,8,4,5,10,17,20,0};
	char str[] = "hello world";
	char *strs[] = {"world", "hello", "test", "apple"};  // 字符串数组
    int n_strs = sizeof(strs) / sizeof(char *);  // 字符串个数
	int i;
	int *p;

	myqsort(a, sizeof(a) / sizeof(int), sizeof(int), cmp_int);
	show_arr(a, sizeof(a) / sizeof(int), sizeof(int), show_int);
	printf("\n");

	myqsort(str, strlen(str), sizeof(char), cmp_char);
	show_arr(str, strlen(str), sizeof(char), show_char);
	putchar('\n');

	// 新增：测试字符串数组排序
    myqsort(strs, n_strs, sizeof(char *), cmp_string);  // 排序字符串数组
    show_arr(strs, n_strs, sizeof(char *), show_string);  // 输出排序结果
    printf("\n");


	return 0;
}

static int cmp_int(const void *data1, const void *data2)
{
	const int *d1 = (const int *)data1;
	const int *d2 = (const int *)data2;

	return *d2 - *d1;
}

static int cmp_char(const void *data1, const void *data2)
{
	const char *d1 = (const char *)data1;
	const char *d2 = (const char *)data2;

	return *d1 - *d2;
}

static int cmp_string(const void *data1, const void *data2)
{
	char **d1 = (char **)data1; // 指向数组中变量的地址,指针数组变量就是char *,地址就是char **
	// char **d2 = (char **)data2;
	char *const*d2 = data2; // **d2只读的

	return strcmp(*d1, *d2);
}

static void show_int(const void *data)
{
	const int *d = data;
	printf("%d ", *d);
}

static void show_char(const void *data)
{
	const char *d = data;
	printf("%c", *d);
}

static void show_string(const void *data)
{
	char **d = (char **)data;
	printf("%s ", *d);
}




